package com.likeycy.my.list;

/**
 * @ClassName: AbstractList
 * @Description: 抽象集合父类，主要是抽取子类公共的需要默认实现的方法
 * @Author: sodagreen
 * @Date: 2021/2/23 4:12
 * @Version: 1.0
 */
public abstract class AbstractList<E> implements List<E> {
    /** 元素总数量 */
    protected int size;

    /**
     * 获取集合内元素的总数量
     * @return 返回元素总数量的和
     */
    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public boolean contains(E element) {
        int index = indexOf(element);
        return index != ELEMENT_NOT_FOUND;
    }

    @Override
    public void add(E element) {
        add(size, element);
    }

    /**
     * 由于多个方法会抛出同一个异常，这里将异常封装为一个方法进行复用
     *
     * @param index
     */
    protected void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + "，Size:" + size);
    }

    /**
     * 检查传入的索引是否越界，如果越界，抛出异常
     *
     * @param index
     */
    protected void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    /**
     * 检查添加元素时传入的索引是否越界，如果越界，抛出异常
     *
     * @param index
     */
    protected void rangeCheckForAdd(int index) {
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

}
